package br.com.rotary.manager.pesquisar;

import br.com.rotary.enums.Relatorio;
import br.com.rotary.manager.generico.ManagerPesquisarGenerico;
import br.com.rotary.modelo.Anexo;
import br.com.rotary.modelo.Clube;
import br.com.rotary.modelo.Endereco;
import br.com.rotary.modelo.FichaInscricao;
import br.com.rotary.modelo.Pessoa;
import br.com.rotary.servico.ClubeServico;
import br.com.rotary.servico.FichaInscricaoServico;
import br.com.rotary.servico.PessoaServico;
import br.com.rotary.servico.RelatorioServico;
import br.com.rotary.utilitario.ArquivoUtilitario;
import br.com.rotary.utilitario.Msg;
import br.com.rotary.vo.RelatorioRelacaoVO;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarFichaInscricao extends ManagerPesquisarGenerico<FichaInscricao> {

    @EJB
    FichaInscricaoServico fichaServico;
    @EJB
    PessoaServico pessoaServico;
    @EJB
    ClubeServico clubeServico;
    @EJB
    RelatorioServico relatorioServico;
    private FichaInscricao ficha;
    private FichaInscricao fichaExcluir;
    private String fichaId;
    private ArquivoUtilitario arquivoUtilitario;
    private List<Anexo> anexosRemover;

    @Override
    public void init() {
        setServico(fichaServico);

        iniciarFicha();

        this.anexosRemover = new ArrayList<Anexo>();

        this.arquivoUtilitario = new ArquivoUtilitario();

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.fichaId = params.get("ficha");

        if (this.fichaId != null) {
            pesquisarFichaInscricao(Long.parseLong(this.fichaId));
        }
    }

    @Override
    public void pesquisar() {
        entidadePesquisar = this.ficha;

        getSearchResults().setFirst(0);
        onLoadModel();
    }

    public void pesquisarFichaInscricao(Long id) {
        this.ficha = fichaServico.pesquisar(id);

        if (this.ficha.getConvidado() == null) {
            this.ficha.setConvidado(new Pessoa());
        }
    }

    public void atualizar() {
        try {

            arquivoUtilitario.gravarAnexos(this.ficha.getAnexos());
            arquivoUtilitario.removerBytes(this.ficha.getAnexos());

            if (!this.anexosRemover.isEmpty()) {
                for (Anexo anexo : this.anexosRemover) {
                    arquivoUtilitario.excluirArquivo(new File(anexo.getUrl() + anexo.getNome()));
                }
            }

            fichaServico.atualizar(this.ficha);

            pesquisarFichaInscricao(this.ficha.getId());

            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    @Override
    public void limpar() {
        init();
    }

    @Override
    public void remover() {
        try {
            this.fichaExcluir.setAtivo(Boolean.FALSE);
            this.fichaServico.atualizar(this.fichaExcluir);

            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    public void imprimirNomesCracha() {
        HashMap parametros = new HashMap();

        List<Map<String, String>> nomes = new ArrayList<Map<String, String>>();

        Map<String, String> nome;

        for (FichaInscricao fichaInscricao : fichaServico.pesquisarTodos()) {

            nome = new HashMap<String, String>();

            nome.put("nomeCracha", fichaInscricao.getNomeCracha());

            nomes.add(nome);

            if (fichaInscricao.getNomeCrachaConvidado() != null && !fichaInscricao.getNomeCrachaConvidado().isEmpty()) {
                nome = new HashMap<String, String>();

                nome.put("nomeCracha", fichaInscricao.getNomeCrachaConvidado());

                nomes.add(nome);
            }

        }

        RelatorioServico.genReport(parametros, nomes, Relatorio.NOMES_CRACHA);
    }

    public void imprimirRelacaoClube() {
        HashMap parametros = new HashMap();

        List<RelatorioRelacaoVO> relacaoVOs = new ArrayList<RelatorioRelacaoVO>();
        RelatorioRelacaoVO relacao;


        if ((this.ficha.getClube() != null && this.ficha.getClube().getId() == null) || this.ficha.getClube() == null) {
            List<Clube> clubes = clubeServico.clubesInscritos();

            for (Clube clube : clubes) {
                iniciarFicha();
                this.ficha.setClube(clube);

                List<FichaInscricao> fichas = fichaServico.pesquisar(this.ficha, null, null);

                relacao = new RelatorioRelacaoVO();

                relacao.setClube(clube);
                relacao.setFichas(fichas);
                relacao.setValorArrecadadoRotariano(relatorioServico.valorArrecadadoRotariano(clube));
                relacao.setValorArrecadadoConvidado(relatorioServico.valorArrecadadoConvidado(clube));
                relacao.setValorArrecadado(relacao.getValorArrecadadoConvidado() + relacao.getValorArrecadadoRotariano());

                relacaoVOs.add(relacao);
            }
        } else if (this.ficha.getClube() != null && this.ficha.getClube().getId() != null) {

            List<FichaInscricao> fichas = fichaServico.pesquisar(this.ficha, null, null);

//            valorArrecadado = relatorioServico.valorArrecadadoRotariano(this.ficha.getClube());
//
//            relacaoVOs.add(new RelatorioRelacaoVO(fichas, this.ficha.getClube(), valorArrecadado));
        }

        RelatorioServico.genReport(parametros, relacaoVOs, Relatorio.RELACAO_CLUBE);
    }

    public void imprimirRelacaoGeral() {
        HashMap parametros = new HashMap();

        List<FichaInscricao> fichas = fichaServico.pesquisar(this.ficha, null, null);

        int quantidade = 0;

        for (FichaInscricao ficha : fichas) {

            quantidade++;

            if (ficha.getTipoConvidado() != null) {
                quantidade++;
            }
        }

        parametros.put("quantidade", quantidade);

        RelatorioServico.genReport(parametros, fichas, Relatorio.RELACAO_GERAL);
    }

    public void adicionarAnexo(FileUploadEvent event) throws IOException {
        try {

            this.ficha.getAnexos().add(arquivoUtilitario.adicionarArquivo(event.getFile().getContents(), event.getFile().getFileName(), event.getFile().getContentType()));

        } catch (FileNotFoundException e) {

            System.err.println(e);
        } catch (SQLException e) {

            System.err.println(e);
        }
    }

    /**
     * Remove o anexo da lista de anexos que está sendo adicionado e remove o
     * arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexo(Anexo anexo) {
        try {
            this.anexosRemover.add(anexo);
            this.ficha.getAnexos().remove(anexo);
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public FichaInscricao getFicha() {
        return ficha;
    }

    public void setFicha(FichaInscricao ficha) {
        this.ficha = ficha;
    }

    public FichaInscricao getFichaExcluir() {
        return fichaExcluir;
    }

    public void setFichaExcluir(FichaInscricao fichaExcluir) {
        this.fichaExcluir = fichaExcluir;
    }

    private void iniciarFicha() {
        this.ficha = new FichaInscricao();
        this.ficha.setParticipante(new Pessoa());
        this.ficha.getParticipante().setEndereco(new Endereco());
        this.ficha.setConvidado(new Pessoa());
        this.ficha.setClube(new Clube());
    }
}
